package httpx

import (
	"ci-control-backend/common/responses"
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
)

type controllerFunc func(c *Context) any

// Controller 封装接口，使接口可以直接返回数据，而不是先发送数据再返回
func Controller(fun controllerFunc) gin.HandlerFunc {
	return func(c *gin.Context) {
		ctx := getContext(c) // 获取实例
		defer ctx.Free()     // 尝试释放
		res := fun(ctx)      // 获取执行结果
		switch v := res.(type) {
		case error: //	相当于throw err
			ctx.Send(responses.Error(v)) //发送错误
			logrus.Errorf("%+v", v)
			break
		case *responses.ApiResult:
			ctx.Send(v) //发送结果
			break
		case string:
			ctx.Send(responses.SuccessWithMsg(v)) // 字符串，封装成消息发送
			break
		default:
			ctx.Send(responses.SuccessWithData(v)) //其他类型，一律按data处理
			break
		}
	}
}

type middlewareFunc func(c *Context) error

// Middleware 封装中间件，使中间件可以直接返回错误，而不是先发送错误再返回
func Middleware(fun middlewareFunc) gin.HandlerFunc {
	return func(c *gin.Context) {
		ctx := getContext(c) // 获取实例
		defer ctx.Free()
		err := fun(ctx) // 执行并捕捉错误
		if err != nil { // 有错误
			ctx.Send(responses.ErrorWithMsg("error: %+v", err))
			ctx.Abort()
		} else { // 没有错误
			ctx.Next()
		}
	}
}
